/*
 * @Description: 
 * @Version: 2.0
 * @Autor: wangmiao
 * @Date: 2022-09-19 19:04:36
 * @LastEditors: wangmiao
 * @LastEditTime: 2022-09-20 18:53:53
 */

// 1、 原型链继承


// function Parent() {
//   this.test = ['张三']
// }

// function Son() {
// }

// Son.prototype = new Parent() // 创建父类的实例并赋值给子类的原型

// let son1 = new Son()
// let son2 = new Son()

// son1.test.push('李四')

// console.log(son1.test) // [ '张三', '李四' ]

// console.log(son2.test) // [ '张三', '李四' ]


// 2、借用构造函数

// function Parent(name) {
//   this.name = '张三';
//   this.test = [1];
// }
// Parent.prototype.demo = function () {
//   console.log('demo');
// }
// function Son(name, age) {
//   Parent.call(this, name);
//   this.age = age;
// }
// let son1 = new Son();
// let son2 = new Son();
// son1.test.push(2);
// son1.demo(); // 报错, 不能继承父类原型上的属性
// console.log(son1.test); // [ 1, 2 ]
// console.log(son2.test); // [ 1 ]



// 组合式继承（组合原型链继承和借用构造函数继承）（常用）

// function Parent(name) {
//   this.name = name;
//   this.test = [1];
// }
// Parent.prototype.demo = function () {
//   console.log('demo');
// }
// function Son(name, age) {
//   Parent.call(this, name); // 第二次调用父级构造函数
//   this.age = age;
// }
// Son.prototype = new Parent(); // 创建父类的实例并赋值给子类的原型 (第一次调用父级构造函数)
// let son1 = new Son();
// let son2 = new Son();
// son1.test.push(2);
// son1.demo(); // 可访问原型上的属性
// console.log(son1.test); // [ 1, 2 ]
// console.log(son2.test); // [ 1 ]


// 寄生组合式继承

// // parent：父类构造函数    son: 子类构造函数
// function inherit(parent, son) {
  
//   // 创建父类原型副本
//   const pro = Object.create(parent.prototype);
//   // 防止重写原型造成失去默认的constructor
//   pro.constructor = son;
//   // 将之前创建的副本赋值给子类原型
//   son.prototype = pro;
// }

// function Parent(name) {
//   this.name = name;
//   this.test = [1];
// }

// Parent.prototype.getName = function () {
//   console.log(this.name);
// }

// function Son(name, age) {
//   Parent.call(this, name); 
//   this.age = age;
// } 

// inherit(Parent, Son) 

// // 给子类原型增加方法，这一步得放在 inherit 函数调用之后，不然会丢失，因为inherit方法内给Son的原型重新赋值
// Son.prototype.getAge = function () {
//   console.log(this.age);
// }
// let son1 = new Son('张三', 23);
// let son2 = new Son();
// son1.test.push(2);
// son1.getName(); // 继承父累原型属性
// son1.getAge(); 
// console.log(son1.test); // [ 1, 2 ]
// console.log(son2.test); // [ 1 ]


// es6类继承

class Parent{
  constructor(name) {
    this.name = name;
  }

  getName() {
    return this.name;
  }
}

class Son extends Parent{
  constructor(name, age) {
    super(name);
    this.age = age;
    
  }
}

const son = new Son('张三', 22);
const son1 = new Son('李四', 23);
console.log(son.age)
console.log(son.getName())
console.log(son1.getName())








